package start;

import gui.DefaultWindow;

import java.awt.Dimension;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.swing.JOptionPane;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
/**
 * eCookBook
 * Kochrezeptverwaltungsprogramm als Projekt einer Studentengruppe der Hochschule Osnabrueck.
 * Mit dieser Software koennen sich Kochrezepte anlegen und verwalten lassen.
 * Hauptaugenmerk liegt dabei auf der Usability.
 * 
 * Diese Klasse prueft ob alle Ordner und Dateien vorhanden sind und generiert diese, falls nicht vorhanden.
 * Anschließend wird die GUI aufgebaut und das Iconset geladen.
 * @author Dominik Korittki
 * @author Dennis Wittkoetter
 * @author Dennis Oeguetveren
 *
 */
public class Start {
	/**Hauptfenster der GUI*/
	static DefaultWindow defWindow;
	
	/**Rezept-XML als Datenmodell im Speicher*/
	final static File rezepteXML = new File(Config.getRezeptpfad(), Config.getDateinameRezepte());
	
	/**Kategorie-XML als Datenmodell im Speicher*/
	final static File kategorieXML = new File(Config.getRezeptpfad(), Config.getDateinameKategorie());
	
	/**Rezept Ordner als Datenmodell im Speicher*/
	final static File rezepteOrdner = new File(Config.getRezeptpfad());
	
	/**Bildordner als Datenmodell im Speicher*/
	final static File bildOrdner = new File(Config.getBildpfad());
	
	/**Thumbnail Ordner als Datenmodell im Speicher*/
	final static File thumbOrdner = new File(Config.getThumbpfad());
	
	/**Iconset als Datenmodell im Speicher*/
	static Images imgs;
	
	/**Initiiert die GUI und legt das Iconset an. Von hier aus koennen andere GUI Klassen auf Icons zugreifen.*/
	public Start() {
		defWindow = new DefaultWindow();
		defWindow.setSize(900, 600);
		defWindow.setVisible(true);
		defWindow.setPreferredSize(new Dimension(900, 600));
		
		/*-------------------------------------------
		 * Zentrale Fehlerabfangstelle
		 --------------------------------------------*/
		try {
			imgs = new Images();
		} catch (IOException e) {
			JOptionPane.showMessageDialog(defWindow, 
					"Konnte internes Iconset nicht laden. Fehlerhafte .jar Datei?", 
					"Fehler", 
					JOptionPane.ERROR_MESSAGE);
			if(Config.debugMode()) e.printStackTrace();
			System.exit(-1);
		}

		try {
			defWindow.buildGUI();
		} catch (IOException e) {
			JOptionPane.showMessageDialog(defWindow, 
					"Konnte das Programm wegen Eingabe / Ausgabefehlern nicht starten", 
					"Fehler", 
					JOptionPane.ERROR_MESSAGE);
			if(Config.debugMode()) e.printStackTrace();
			System.exit(-1);
		} catch (JDOMException e) {
			JOptionPane.showMessageDialog(defWindow, 
					"Konnte das Programm wegen XML Komplikationen nicht starten. \n" +
					"Eventuell hilft Löschen des saved_recipes Ordners", 
					"Fehler", 
					JOptionPane.ERROR_MESSAGE);
			if(Config.debugMode()) e.printStackTrace();
			System.exit(-1);
		}
	}
	
	/**
	 * Liefert das Hauptfenster der GUI
	 * @return DefaultWindow
	 */
	public static DefaultWindow getDefWindow() {
		return defWindow;
	}

	/**
	 * Liefert das Rezept-XML als Datenmodel
	 * @return File
	 */
	public static File getRezeptexml() {
		return rezepteXML;
	}

	/**
	 * Liefert den Rezept Ordner als Datenmodel
	 * @return File
	 */
	public static File getRezepteordner() {
		return rezepteOrdner;
	}

	/**
	 * Liefert den Bildordner als Datenmodel
	 * @return File
	 */
	public static File getBildordner() {
		return bildOrdner;
	}

	/**
	 * Liefert das Thumbnail Ordner als Datenmodel
	 * @return File
	 */
	public static File getThumbordner() {
		return thumbOrdner;
	}

	/**
	 * Liefert das Kategorie-XML als Datenmodel
	 * @return File
	 */
	public static File getKategoriexml() {
		return kategorieXML;
	}

	/**
	 * Liefert das Iconsets als Datenmodel
	 * @return Images
	 */
	public static Images getImgs() {
		return imgs;
	}

	/**
	 * Pruefen / Anlegen von benoetigten Verzeichnissen.
	 * Initialisierung des 
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) {
		if(!bildOrdner.exists()) {
			System.out.println("Keine Bildverzeichniss gefunden, lege an...");
			boolean retmkdir1 = bildOrdner.mkdirs();
			if(!retmkdir1) {
				System.out.println("Konnte Verzeichnisse nicht anlegen. Schreibrechte gesetzt?");
				System.exit(-1);
			}
		}
		
		if(!thumbOrdner.exists()) {
			System.out.println("Kein Thumbnail Verzeichniss gefunden, lege an...");
			if(!thumbOrdner.mkdirs()) {
				System.out.println("Konnte Verzeichniss nicht anlegen");
			}
		}
		
		if(!rezepteXML.exists()) {
			System.out.println("Rezepte XML existiert nicht. Anlegen ...");
			
			Element root = new Element("root");
			Document doc = new Document(root);
			try {
				FileOutputStream out = new FileOutputStream(getRezeptexml());
				XMLOutputter serializer = new XMLOutputter(Format.getPrettyFormat());
				serializer.output(doc, out);
				
			} catch(FileNotFoundException e) {
				e.printStackTrace();
			} catch(IOException e) {
				e.printStackTrace();
			}
		}
		
		if(!kategorieXML.exists()) {
			System.out.println("Kategorie XML existiert nicht. Anlegen ...");
			Element category = new Element("category");
			category.addContent(new Element("name").setText("Hauptspeise"));
			category.addContent(new Element("name").setText("Vorspeise"));
			category.addContent(new Element("name").setText("Nachspeise"));
			category.addContent(new Element("name").setText("Beilage"));
			category.addContent(new Element("name").setText("Suppe"));
			category.addContent(new Element("name").setText("Gebäck"));
			Document doc = new Document(category);
			try {
				FileOutputStream out = new FileOutputStream(getKategoriexml());
				XMLOutputter serializer = new XMLOutputter(Format.getPrettyFormat());
				serializer.output(doc, out);
				
			} catch(FileNotFoundException e) {
				e.printStackTrace();
			} catch(IOException e) {
				e.printStackTrace();
			}
		}
		new Start();
	}			
}
